 import java.awt.*;
 import javax.swing.JFrame;
 import javax.swing.JComponent;
 import javax.swing.JList;
 import javax.swing.JSplitPane;
 import javax.swing.JScrollPane;
 import javax.swing.DefaultListModel;

 /**
 * Classe principale del progetto.
 * <p>Gestisce il main dell'applicazione e costruisce l'interfaccia grafica.</p> 
 * <p>L'interfaccia grafica è composta da un {@link GraphPanel} che si occupa
 * di visualizzare e gestire le interazioni con il grafo, e da un JList che
 * si occupa di mostrare i passaggi effettuati dagli algoritmi implementati 
 * ({@link Dijkstra} e {@link BellmanFord}).</p>
 * <p>Entrambi i componenti sono racchiusi in un JSplitPane per poterli 
 * ridimensionare a runtime.</p>
 * <p>Il componente {@link GraphPanel} si avvale di 2 classi, {@link Node} e {@link Arc}
 * che rappresentano rispettivamente i nodi e gli archi presenti nel grafo.</p>
 * <p>Gli algoritmi implementati sono quelli di {@link Dijkstra} e {@link BellmanFord},
 * entrambi derivati da una calsse astratta {@link AlgorithmBase} 
 * la quale a sua volta implementa l'interfaccia  {@link Algorithm}.</p>            
 *    
 * @author Massimiliano Ferretti matricola 79769 
 */

 public class Main{
  
  public static void main(String[] args)
  {
    JFrame f = new JFrame("Graph path - Massimiliano Ferretti 79769");
    f.setSize(900, 600);
    
    // Aggiunge i pulsanti e il componente Graph
    // JComponent graph = new GraphPanel();
    // graph.setOpaque(true);
    // f.add(graph);
    
    GraphPanel g = new GraphPanel();
    g.setFocusTraversalKeysEnabled(false);
    DefaultListModel lm = new DefaultListModel();
    JList l = new JList(lm);
    JScrollPane scroll = new JScrollPane(l);

    JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT, g, scroll);
    split.setDividerLocation(450);
    GraphListener listener = new GraphListener(g, l, lm);
    
    f.add(split);
     
    g.setFocusable(true); 
    g.addKeyListener(listener);
    g.addMouseListener(listener);
    g.addMouseMotionListener(listener);

    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
  }                                                   
 } 